home *** CD-ROM | disk | FTP | other *** search
/ Chip 1997 March / CHIP Mart 1997.iso / prg / CHKIO / CHKPORTS.MOD < prev    next >
Text File  |  1996-04-09  |  5KB  |  178 lines

  1. (* ------------------------------------------------------------ *)
  2. (* Title       : CheckPorts                                     *)
  3. (* Version     : 1.0                                            *)
  4. (* Author      : PhG                                            *)
  5. (* Overview    : scan each port                                 *)
  6. (* Future      : no                                             *)
  7. (* Notes       : very quick & dirty                             *)
  8. (* Usage       : CHKPORT <port [count]> | <free> | <used>       *)
  9. (*                                                              *)
  10. (* Who When     What                                            *)
  11. (* --- -------- ----------------------------------------------- *)
  12. (* PhG 04-08-96 created                                         *)
  13. (* ------------------------------------------------------------ *)
  14.  
  15. MODULE ChkPorts;
  16.  
  17. IMPORT SYSTEM;
  18. IMPORT IO;
  19. IMPORT Str;
  20. IMPORT Lib;
  21.  
  22. (* ------------------------------------------------------------ *)
  23.  
  24. TYPE
  25.    str = ARRAY [0..15] OF CHAR;
  26. CONST
  27.     Empty = 0FFFFH;
  28.  
  29. PROCEDURE PadHex (v : CARDINAL; n : CARDINAL) : str;
  30. CONST
  31.     padStr = "0000000000000000"; (* 16 digits *)
  32. VAR
  33.     S : str;
  34.     R : str;
  35.     value : LONGCARD;
  36.     ok : BOOLEAN;
  37.     delta : CARDINAL;
  38. BEGIN
  39.     n := n MOD 16; (* better safe than sorry! *)
  40.     value := LONGCARD(v);
  41.     Str.CardToStr (value,S,16,ok);
  42.     delta := n - Str.Length(S);
  43.     Str.Slice (R,padStr,0,delta);
  44.     Str.Append (R,S);
  45.     RETURN R;
  46. END PadHex;
  47.  
  48. PROCEDURE ShowIOport (i : CARDINAL; v : CARDINAL);
  49. VAR
  50.   S : str;
  51. BEGIN
  52.   S := PadHex (i,4);
  53.   IO.WrStr ("I/O port $");
  54.   IO.WrStr (S);
  55.   IF v = Empty THEN
  56.      IO.WrStr (" is probably free ($");
  57.   ELSE
  58.      IO.WrStr (" is probably NOT free ($");
  59.   END;
  60.   S := PadHex (v,4);
  61.   IO.WrStr (S);
  62.   IO.WrStr(")");
  63.   IO.WrLn;
  64. END ShowIOport;
  65.  
  66. PROCEDURE Bye (errcode : CARDINAL);
  67. BEGIN
  68.     Lib.SetReturnCode(SHORTCARD(errcode));
  69.     HALT;
  70. END Bye;
  71.  
  72. PROCEDURE GetValue (S : str) : CARDINAL;
  73. VAR
  74.     value : LONGCARD;
  75.     Base : CARDINAL;
  76.     ok : BOOLEAN;
  77. BEGIN
  78.     IF S[0] = "$" THEN
  79.        Str.Delete (S,0,1);
  80.        Base := 16;
  81.     ELSE
  82.        Base := 10;
  83.     END;
  84.     value := Str.StrToCard(S,Base,ok);
  85.     IF ok = FALSE THEN
  86.         IO.WrStr("Parameter ");
  87.         IO.WrStr(S);
  88.         IO.WrStr(" could not be converted to a number!");
  89.         Bye(2);
  90.     END;
  91.     IF value > 0FFFFH THEN
  92.         IO.WrStr("Value ");
  93.         IO.WrStr(S);
  94.         IO.WrStr(" is superior to $FFFF!");
  95.         Bye(2);
  96.     END;
  97.     RETURN CARDINAL(value);
  98. END GetValue;
  99.  
  100.  
  101.  
  102. (* ------------------------------------------------------------ *)
  103.  
  104. CONST
  105.     FirstIOport = 0000H;
  106.     LastIOport = 03FFH;
  107. VAR
  108.     S : str;
  109.     i : CARDINAL;
  110.     v : CARDINAL;
  111.     argc : CARDINAL;
  112.     firstval : CARDINAL;
  113.     lastval : CARDINAL;
  114. BEGIN
  115.     argc := Lib.ParamCount();
  116.     IF (argc < 1) OR (argc > 2) THEN
  117.         IO.WrStr("Usage: CHKPORTS <I/O port [count]> | <FREE> | <USED>");
  118.         IO.WrLn;
  119.         IO.WrStr("Examples: CHKPORTS $2F8");
  120.         IO.WrLn;
  121.         IO.WrStr("          CHKPORTS $220 16");
  122.         IO.WrLn;
  123.         IO.WrStr("          CHKPORTS FREE");
  124.         IO.WrLn;
  125.         IO.WrStr("          CHKPORTS USED");
  126.         IO.WrLn;
  127.         IO.WrStr("Note: I/O ports are checked in the [$0000..$03FF] range");
  128.         Bye(1);
  129.     END;
  130.     Lib.ParamStr(S,1);
  131.     Str.Caps(S);
  132.     IF (S = str("FREE")) AND (argc=1) THEN
  133.         FOR i := FirstIOport TO LastIOport DO
  134.            v := SYSTEM.InW (i);
  135.            IF v = Empty THEN
  136.               ShowIOport(i,v);
  137.            END;
  138.         END;
  139.         Bye(0);
  140.     ELSIF (S = str("USED")) AND (argc=1) THEN
  141.         FOR i := FirstIOport TO LastIOport DO
  142.            v := SYSTEM.InW (i);
  143.            IF v <> Empty THEN
  144.               ShowIOport(i,v);
  145.            END;
  146.         END;
  147.         Bye(0);
  148.     END;
  149.     firstval := GetValue(S);
  150.     IF (firstval < FirstIOport) OR (firstval > LastIOport) THEN
  151.         IO.WrStr("I/O port address is not in [$0000..$03FF] range!");
  152.         Bye(3);
  153.     END;
  154.     IF argc=1 THEN
  155.         lastval := firstval
  156.     ELSE
  157.         Lib.ParamStr(S,2);
  158.         Str.Caps(S);
  159.         lastval := firstval + GetValue(S) -1;
  160.         IF (firstval < FirstIOport) OR (firstval > LastIOport) THEN
  161.            IO.WrStr("Last I/O port address to check is not in [$0000..$03FF] range!");
  162.            Bye(3);
  163.         END;
  164.         IF lastval < firstval THEN
  165.            IO.WrStr("Tsk tsk!");
  166.            Bye(3);
  167.         END;
  168.     END;
  169.     FOR i := firstval TO lastval DO
  170.         v := SYSTEM.InW (i);
  171.         ShowIOport(i,v);
  172.     END;
  173.     Bye(0);
  174. END ChkPorts.
  175.  
  176.  
  177.  
  178.